page.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. 'use server';
  2. import type { Metadata } from 'next';
  3. import './style.scss';
  4. import { notFound } from 'next/navigation';
  5. import { fetchDocument } from '@/lib/api/page/document';
  6. export async function generateMetadata({ params }: { params: Promise<{ code: string }> }): Promise<Metadata> {
  7. const { code } = await params;
  8. const result = await fetchDocument(code);
  9. if (!result.success || !result.data) {
  10. return {
  11. title: '문서를 찾을 수 없음 - 개미투자'
  12. };
  13. }
  14. const doc = result.data;
  15. const plainText = doc.content
  16. ? doc.content.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 160)
  17. : doc.subject;
  18. const canonicalUrl = `https://antooza.com/docs/${doc.code}`;
  19. return {
  20. title: `${doc.subject} - 개미투자`,
  21. description: plainText,
  22. alternates: { canonical: canonicalUrl },
  23. robots: { index: true, follow: true },
  24. openGraph: {
  25. title: doc.subject,
  26. description: plainText,
  27. url: canonicalUrl,
  28. type: 'article'
  29. }
  30. };
  31. }
  32. export default async function DocumentPage({ params }: { params: Promise<{ code: string }> }) {
  33. const { code } = await params;
  34. const result = await fetchDocument(code);
  35. if (!result.success || !result.data) {
  36. return notFound();
  37. }
  38. const doc = result.data;
  39. return (
  40. <>
  41. <article id='docs'>
  42. <h1>{doc.subject}</h1>
  43. {doc.content && (
  44. <section dangerouslySetInnerHTML={{ __html: doc.content }} className='pb-10'/>
  45. )}
  46. </article>
  47. </>
  48. );
  49. }